home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / dev / misc / MaplePSP.lha / MaplePSP / psp < prev   
Text File  |  1997-10-09  |  7KB  |  198 lines

  1. ############################################################################
  2. #
  3. # $RCSfile: psp $
  4. # $Revision: 2.0 $
  5. # $Date: 1997/10/03 14:28:00 $
  6. # $Author: ssolie $
  7. #
  8. ############################################################################
  9. #
  10. # Copyright (c) 1997 Software Evolution.  All Rights Reserved.
  11. #
  12. ############################################################################
  13. #
  14. # PSP Support Library -- Personal Software Process (PSP) support functions
  15. #
  16. # This set of Maple V Release 3 functions contains many functions which can
  17. # be used to process PSP data.  Each function is designed to perform a
  18. # specific action or produce a specific report.
  19. #
  20. # These functions may or may not be exactly what is required for your
  21. # specific PSP means.  However, the functions do provide a basis from which
  22. # to build upon to improve and enhance your PSP processes.
  23. #
  24. # For more information about the PSP, please refer to:
  25. #    Humphrey, Watts S., "A Discipline for Software Engineering"
  26. #    (Don Mills, Ontario: Addison-Wesley, 1995), ISBN 0-201-54610-8.
  27. #
  28. # WARNING:
  29. #  Please note that not all of the functions properly protect themselves
  30. #  from incorrect parameters and may have unexpected results when used
  31. #  improperly.  Always check the source code to be sure.
  32.  
  33.  
  34. ###### prediction_interval ######
  35. `help/text/prediction_interval` := TEXT(
  36.     `FUNCTION: prediction_interval - Calculate range and prediction interval`,
  37.     ``,
  38.     `CALLING SEQUENCE:`,
  39.     `   prediction_interval(x_data, y_data, estimate, percent)`,
  40.     ``,
  41.     `PARAMETERS:`,
  42.     `   x_data   - set of x regression data (estimated values)`,
  43.     `   y_data   - set of y regression data (actual values)`,
  44.     `    estimate - planned or estimated value`,
  45.     `   percent  - prediction interval percentage`,
  46.     ``,
  47.     `SYNOPSIS:`,
  48.     `- Data is supplied as arrays of data equal in length.`,
  49.     ``,
  50.     `- It is useful to know the prediction error when making estimates.  This`,
  51.     `  function uses your historical data and the linear regression method to`,
  52.     `  predict your likely estimation error.  This will give you the ability to`,
  53.     `  know the likely minimum and maximum estimation based on your previous`,
  54.     `  performance.`,
  55.     ``,
  56.     `- The prediction interval percentage means that most of the time the`,
  57.     `  true result will be within the interval.  For example, if you ask for`,
  58.     `  a 90% prediction interval then 90% of the time the true result will`,
  59.     `  be in the interval.  The most common values for the prediction`,
  60.     `  interval used in the PSP are 70% and 90%.`,
  61.     ``,
  62.     `- As with all predictions, there is a danger of misinterpretation.  If`,
  63.     `  your process changes such that it invalidates your historical data,`,
  64.     `  the prediction interval will be meaningless.  Exercise caution before`,
  65.     `  committing to the results.`,
  66.     ``,
  67.     `- This function requires the stats package, and so can be used only after`,
  68.     `  performing the command with(stats).`,
  69.     ``,
  70.     `EXAMPLES:`,
  71.     `> with(stats);`,
  72.     `> plan_loc := [100,327,75,92]: actual_loc := [110,228,90,100];`,
  73.     `> prediction_interval(plan_loc,actual_loc,300,70);`
  74. ):
  75.  
  76. prediction_interval := proc(x_data, y_data, estimated, percent)
  77.     local xk, i, n, beta0, beta1, variance, std_dev, p, t, r, x_avg, y_avg,
  78.           range, lower_limit, upper_limit, projected;
  79.  
  80.     ### Parse arguments ###
  81.     if percent < 0 or percent > 100 then
  82.         ERROR(`Percent must be in the range 0..100`);
  83.     fi;
  84.  
  85.     if estimated < 1 then
  86.         ERROR(`Estimated must be greater than 1`);
  87.     fi;
  88.  
  89.     ### calculate and print out the results ###
  90.     xk        := estimated;
  91.     n        := describe[count](x_data);
  92.     r         := describe[linearcorrelation](x_data, y_data);
  93.     x_avg   := describe[mean](x_data);
  94.     y_avg   := describe[mean](y_data);
  95.  
  96.     beta1 := (sum(x_data[i]*y_data[i], i=1..n) - n*x_avg*y_avg) /
  97.              (sum(x_data[i]^2, i=1..n) - n*x_avg^2);
  98.     beta0 := y_avg - beta1*x_avg;
  99.  
  100.     projected := beta0 + beta1*xk;
  101.     projected := ceil(projected);
  102.  
  103.     variance := 1/(n-2) *
  104.         sum((y_data[i] - beta0 - beta1*x_data[i])^2, i=1..n);
  105.     std_dev := sqrt(variance);
  106.  
  107.     p := (1 + (percent/100))/2;
  108.     t := statevalf[icdf, studentst[n - 2]](p);
  109.     range := t * std_dev * sqrt(1 + 1/n + (xk-x_avg)^2/sum((x_data[i] - x_avg)^2, i=1..n));
  110.     range := ceil(range);
  111.  
  112.     lower_limit := ceil(projected - range);
  113.     upper_limit := ceil(projected + range);
  114.  
  115.     print(`N` = n);
  116.     print('r^2' = evalf(r^2));
  117.     print('beta[0]' = evalf(beta0));
  118.     print('beta[1]' = evalf(beta1));
  119.     print('Projected' = projected);
  120.     print(`Range` = range);
  121.     print(`UPI` = upper_limit);
  122.     print(`LPI` = lower_limit);
  123. end;
  124.  
  125.  
  126. ###### plot_relationship ######
  127. `help/text/plot_relationship` := TEXT(
  128.     `FUNCTION: plot_relationship - Plots data relationship`,
  129.     ``,
  130.     `CALLING SEQUENCE:`,
  131.     `   plot_relationship(x_data, y_data)`,
  132.     ``,
  133.     `PARAMETERS:`,
  134.     `   x_data - set of x data`,
  135.     `   y_data - set of y data`,
  136.     ``,
  137.     `SYNOPSIS:`,
  138.     `- Data is supplied as arrays of numbers equal in length.`,
  139.     ``,
  140.     `- Two measurements are used to determine the strength of the linear`,
  141.     `  relationship between the two sets of data: r^2 and p.`,
  142.     `    r^2 - square of the correlation (r^2 >= 0.9 is very good)`,
  143.     `    p   - correlation significance (p <= 0.05 is very good)`,
  144.     ``,
  145.     `- A high correlation and significance does not guarantee a linear relation-`,
  146.     `  ship exists between the two data sets.  It only provides evidence that a`,
  147.     `  linear relationship might exist.  You must fully understand the processes`,
  148.     `  involving the data values before making any meaningful conclusions.`,
  149.     ``,
  150.     `- This function requires the stats package, and so can be used only after`,
  151.     `  performing the command with(stats)`,
  152.     ``,
  153.     `EXAMPLES:`,
  154.     `> with(stats);`,
  155.     `> plan_loc := [100,327,75,92]: actual_loc := [110,228,90,100];`,
  156.     `> plot_relationship(plan_loc,actual_loc);`
  157. ):
  158.  
  159. plot_relationship := proc(x_data, y_data)
  160.     local sigma, r, t, n, p, x, x_avg, y_avg, beta1, beta0, line,
  161.           graph, points, max_x;
  162.  
  163.     n         := describe[count](x_data);
  164.     r         := describe[linearcorrelation](x_data, y_data);
  165.     t         := abs(r) * sqrt(n - 2) / sqrt(1 - r^2);
  166.     p         := 2 * (1 - statevalf[cdf, studentst[n-2]](t));
  167.     x_avg   := describe[mean](x_data);
  168.     y_avg   := describe[mean](y_data);
  169.     max_x    := evalf(op(2, describe[range](x_data)));
  170.     beta1    := (sum(x_data[i]*y_data[i], i=1..n) - n*x_avg*y_avg) /
  171.                (sum(x_data[i]^2, i=1..n) - n*x_avg^2);
  172.     beta0    := y_avg - beta1*x_avg;
  173.  
  174.     points := convert([x_data, y_data], matrix);
  175.     points := linalg[transpose](points);
  176.     points := convert(points, listlist);
  177.  
  178.     line := [[0, beta0], [max_x, evalf(beta1*max_x + beta0)]];
  179.  
  180.     graph := PLOT(
  181.         SYMBOL(CROSS),
  182.         STYLE(PATCH),
  183.         POINTS(points),
  184.         CURVES(line)
  185.     );
  186.  
  187.     print(`N` = n);
  188.     print('beta[0]' = evalf(beta0));
  189.     print('beta[1]' = evalf(beta1));
  190.     print('r^2' = evalf(r^2));
  191.     print('p' = evalf(p));
  192.     print(graph);
  193. end;
  194.  
  195.  
  196. save `Maple:PSP/psp.m`;
  197. #quit
  198.